#!/usr/bin/python
# _*_ coding: utf8 _*_
#Created: 2010. 6. 15.

##GLOBALS
g_stUrl = "http://www.khoa.go.kr/info/tide/"  #가져올 주소
g_dbFileName = './db/tide.db'

##IMPORTS
import urllib2
import re
import sqlite3

class TideClass():
    m_stResultWeb = ""    #웹에서 긁어온 데이터 저장
    m_stLocation = ""
    m_stYear = ""
    m_stMonth = ""

    def GetTideFromWeb(self, a_stUrlLocation, a_inUrlYear, a_inUrlMonth): 
        pass #웹 데이터 가져오는 메소드
        global g_stUrl
        
        self.m_stLocation = a_stUrlLocation
        self.m_stYear = a_inUrlYear
        self.m_stMonth = a_inUrlMonth
        
        if a_inUrlMonth < 10:     #월의 숫자가 한자리면0을 붙여서 두자리로 만들어줌
            stUrlMonth = '0' + str(a_inUrlMonth)
        else:
            stUrlMonth = str(a_inUrlMonth)
        
        stLocalUrl = g_stUrl + a_stUrlLocation + '/' + str(a_inUrlYear) + stUrlMonth + '.htm'
    
        try:    # 웹 데이터 불러오기
            stWD = urllib2.urlopen(stLocalUrl).read().replace('\r','').replace('\n','').replace('\t','').replace('&nbsp;&nbsp;','')
                #클래스 함수로 리턴
            self.m_stResultWeb = unicode(stWD,'cp949')
        except: #실패 하면 걍 끝
            self.m_stResultWeb = False
        
        self.WebDataToDB()


    def WebDataToDB(self): 
        pass #가져온 데이터를 정규식으로 분리 하는 메소드
        #전처리의 결과가 없으면 과정 안거치고 당장 끝냄
        if not self.m_stResultWeb:
            return False
    
        from BeautifulSoup import BeautifulSoup
        #BS로 해당 태그 내용 추출
        soup = BeautifulSoup(self.m_stResultWeb)
        soupResult = soup('td')

        #태그 내용에서 정규식으로 숫자 추출
        rePattern_1 = re.compile(r'(\d{2})\s:\s(\d{2})..(-?\d{1,3})')
        rePattern_2 = re.compile(r'(\d{2}).(\d{1,2})')

        inDay = 1 #날짜 증가
        tupleHeight = []
        
        for stList in soupResult:
            stStringList = str(stList) #리스트 하나를 스트링으로 전환
           
            if len(stStringList) >= 28:             #정상적인 숫자가 다 있으면 시간, 높이 추출
                reResult = rePattern_1.findall(stStringList)
                a,b,c = reResult[0]
                dataSet = (self.m_stYear, self.m_stMonth, inDay, a, b, c)
                tupleHeight.append(dataSet)
            elif 27 >= len(stStringList) >= 26:     #숫자가 다 없으면 음력 표시 
                reResult = rePattern_2.findall(stStringList)
                inDay = inDay + 1
            else:                                   #이것도 저것도 아니면 빈 날
                reResult = 'Nothing'

        self.StoreHeightDB(tupleHeight)

    def StoreHeightDB(self, tupleData): #데이터 튜플을 받아서 DB에 저장하는 과정
        pass
        global g_dbFileName

        try:
            con = sqlite3.connect(g_dbFileName)
            cur = con.cursor()
            cur.execute("CREATE TABLE IF NOT EXISTS " + self.m_stLocation + "(YEAR Integer, Month Integer, Day Integer ,Hour Integer, Min Integer, Height Integer);")
            cur.executemany("INSERT INTO " + self.m_stLocation + " VALUES(?, ?, ?, ?, ?, ?);", tupleData)
            con.commit()
            print "DB Store OK"
        except:
            print "Error"            
    
    def GetDataFromDB(self, stArea, inY, inM, inD): #데이터를 가져오는 과정. 결과값을 셋트로 던져줌
        pass
        global g_dbFileName
        con = sqlite3.connect(g_dbFileName)
        cur = con.cursor()
        cur.execute("SELECT Hour, Min, Height from " + stArea + " WHERE YEAR = " + str(inY) + " and Month = " + str(inM) + " and Day = " + str(inD) + ";")
        return cur.fetchall()


def main():
    pass
    MainRun = TideClass()
    #MainRun.GetTideFromWeb('BORYEONG', 2010, 7)
    #MainRun.GetTideFromWeb('INCHEON', 2010, 7)
    
    #MainRun.GetDataFromDB('BORYEONG', 2010, 6, 8)
    a = MainRun.GetDataFromDB('INCHEON', 2010, 7, 10)
    
    for aa in a:
        q,w,e = aa
        ppp = str(q) + " 시 " + str(w) + " 분 : 수위 " + str(e) + "cm"
        print ppp
         

if __name__ == "__main__":
    main()
